6
תגובות
אהלן ..
אני מנסה לייעל שאיתה שמופעלת עשרות פעמים פרטנית באיחוד תנאים כמו בדוגמא הנ"ל.
במקום שתפעל עשרות פעמים יצרתי שורת where ארוכה מאוד עם איחוד תנאים שונים.
אני מחפש נתון מסויים שיופיע רק עם אחד מזוג התנאים יתאים וגם יהיה שווה לאחד הערכים בתנאי השלישי.
העיניין שאני מגלה שכל OR כזה ממש מוריד את ביצועי החיפוש ועדיף כבר לחפש פרטנית..

יש למישהו הצעות לייעול?

תודה שבת שלום.

select * from test where(( test.a=12 and test.b>12)or( test.a=14 and test.b>3)) and test.c in( 1,2,3)

6 תשובות

avatar ענה intval ב 04 למאי 2012 #

להוסיף אינדקסים על השדות שלפיהם יש שליפות (וחיפושים).
במקרה הזה אפשר אינדקס אחד משותף על כל שלושת השדות, אבל בסדר c,b,a שמתחיל מ C

avatar ענה משתמש_197722 ב 04 למאי 2012 #

אהלן אלכס ..
יש אינדקסים פרטניים על כל אחד מהשדות שעליהן מבוצעות החיפוש..
עדיין מדובר בשרשור של 15/20 זוגות של תנאים עם OR ..ומשום מה OR מאט את החיפושים בDB קריטית..
השאלה אם ניתן לבצע פה משהו מסוג אחר בכדי לייעל את הפעולות

תודה רבה על התשובה

avatar ענה intval ב 04 למאי 2012 #

תוסיף explain לפני השאילת ותראה מה המסד מנסה לעשות כשהוא מפעיל את השאילתה.
אולי אפשר לשלוף שני סאב-סטים שונים של נתונים ואחרי זה לחבר (או לחסר) אותםי. זה מאוד תלוי בשאילת ובלי לראות אותה אין לי הרבה מה להגיד.

avatar ענה משתמש_197722 ב 04 למאי 2012 #

ככה בידיוק נראת השאילתא רק עם שמות שונים פישטתי את זה לצורה הפשוטה ביותר שאוכל להסביר..
צמד שדות בתוך תנאי אחד ועוד השוואה לקבוצת מספרים אחרת כמו בדוגמא
אקספליין לא מוציא משהו חריג..
מבחינת יעילות אין מה לעשות סאב-סלקט אולי להכניס קייס ?

avatar ענה intval ב 04 למאי 2012 #

אני לא חושב שפיצול איכשהו ישנה משהו, אבל אפשר אולי לנסות ככה:

select * from test where

test.c in( 1,2,3) AND
a in(12, 14) AND  /* aint sure whether this will help or not. need a check */
b > 3 AND /* min(b) */

(
  ( test.a=12 and test.b>12) or
  ( test.a=14 and test.b>3)
)

ובמקום ליצור אינדקסים נפרדים על a ועל b
אולי יש טעם ליצור אינדקס משותף.

avatar ענה משתמש_197722 ב 05 למאי 2012 #

תודה רבה אני אבדוק